/**
 * Registrazione
 * 
 * Classe di controllo per il form di registrazione
 * 
 * @class Registrazione
 * @param form
 * @returns
 */
function Registrazione(form) {
	/**
	 * @field
	 */
	var loader = $('<img src="images/ajax-loader.gif" alt="loader ajax" style="height:16px" />');
	/**
	 * @field
	 */
	var that = this;
	/**
	 * @field
	 */
	var form = $(form);
	/**
	 * @field
	 */
	var timeoutUser = undefined;
	/**
	 * @field
	 */
	var timeoutEmail = undefined;
	/**
	 * @field
	 */
	var ErrorVal = {
		email:true,
		conferma_email:true,
		username:true,
		nome:true,
		cognome:true,
		password:true,
		conferma_password:true
	};
	/**
	 * @field
	 */
	var ErrorCheck = {
			email:true,
			conferma_email:true,
			username:true,
			conferma_password:true
	};
	/**
	 * Semaforo
	 * @field
	 */
	this.checking = 0;
	/**
	 * @field
	 */
	this.validationRules = {
		email:/^[a-zA-Z0-9._%-]{3,21}@[a-zA-Z0-9.-]{3,15}\.[a-zA-Z]{2,4}$/,
		conferma_email: /^[a-zA-Z0-9._%-]{3,21}@[a-zA-Z0-9.-]{3,15}\.[a-zA-Z]{2,4}$/,
		username:/^[a-zA-Z0-9_\-\.]{4,40}$/,
		nome:/^[a-zA-Z0-9_\-\.\,\s]{3,40}$/,
		cognome:/^[a-zA-Z0-9_\-\.\,\s]{3,40}$/,
		password:/^[a-zA-Z0-9_\-\.]{6,40}$/,
		conferma_password:/^[a-zA-Z0-9_\-\.]{6,40}$/
	};
	/**
	 * @field
	 */
	var ErrorValMessages = {
		email:'Campo email non valido!',
		conferma_email:'Campo email non valido',
		username:'Campo username non valido',
		nome:'Campo nome non valido',
		cognome:'Campo cognome non valido',
		password:'Campo passowrd non valido',
		conferma_password:'Campo password non valido'
	}
	/**
	 * Aggiunge le validazioni ai campi
	 */
	var addValidation = function() {
		
		var input = form.find('input[name]');
		input.each(function(){
			//Se non e' in lista saltalo
			var trovato = false;
			for(var i in that.validationRules){
				if(i == $(this).attr('name')){
					trovato = true;
					break;
				}
			}
			
			//Non in lista lo salto!
			if(!trovato){
				return;
			}
			
			$(this).change(function(){
				
				
				var campo_risposta = $(this).parent().find('.risposta');
				var value = $(this).val();
				var name = $(this).attr('name');
				
				var result = value.match(that.validationRules[name]);
				
				if(result == null || result.length != 1){
					
					if(campo_risposta.hasClass('ok')){
						campo_risposta.removeClass('ok');
					}
					
					campo_risposta.html(ErrorValMessages[name]).addClass('errore');
					
					ErrorVal[name] = true;
					
				}else{
					
					if(campo_risposta.hasClass('errore')){
						campo_risposta.removeClass('errore');
					}
					
					campo_risposta.html('Campo corretto!');
					campo_risposta.addClass('ok');
					
					ErrorVal[name] = false;
				}
			});
		});
		
		if(window.console && window.debug){
			window.console.info('Validazioni aggiunte correttamente!');
		}
		
	}
	/**
	 * Chiamata ajax per controllare l'esistenza dell'username
	 * @param name 
	 */
	this.usernameCheck = function(name){
		
		if(window.console && window.debug){
			window.console.info('Controllo l\'username!');
		}
		
		var username = form.find('input[name="username"]');
		username.parent().find('.risposta').removeClass('ok').empty().append(loader.clone());
		
		that.checking++;
		
		var data = {
			c:'CRegistrazione',
			a:'usernameEsistente',
			username:name,
			u:'on'
		};
		
		$.ajax({
			type:'POST',
			url:'index.php',
			success:that.usernameCheckHandler,
			data:data
		});
		
	}
	/**
	 * Gestore chiamata ajax
	 * @param name
	 * @param textResponse
	 */
	this.usernameCheckHandler = function(html,textResponse){
		
		var response = null;
		
		try{
			response = $.parseJSON(html);
		}catch(e){
			window.messaggioPopup.display('Errore','Si &egrave; verificato un errore,\
					nella richiesta dell&#039;username');
			that.checking--;
			return;
		}
		
		var risposta = form.find('input[name=username]').parent().find('.risposta');
		
		if(response == true){
			if(risposta.hasClass('ok')){
				risposta.removeClass('ok');
			}
			
			risposta.addClass('errore');
			risposta.html('Username gia\' esistente!');
			
			ErrorCheck.username = true;
			
		}else{
			if(risposta.hasClass('errore')){
				risposta.removeClass('errore');
			}
			
			risposta.addClass('ok');
			risposta.html('Username ok!');
			
			ErrorCheck.username = false;
		}
		
		that.checking--;
		
	}
	/**
	 * Chiamata ajax per vedere se l'email e' presente nel db
	 * @param mail
	 */
	this.emailCheck = function(mail){
		
		this.checking++;
		
		//Prendo il div risposta di email: tolgo la classe ok, lo svuoto,gli metto il loader
		var email = form.find('input[name="email"]');
		email.parent().find('.risposta').removeClass('ok').empty().append(loader.clone());
		
		var data = {
			c:'CRegistrazione',
			a:'emailEsistente',
			email:mail,
			u:'on'
		};
		
		$.ajax({
			type:'POST',
			url:'index.php',
			success:that.emailCheckHandler,
			data:data
		});
	}
	/**
	 * Gestore chiamata Ajax
	 * @param html
	 * @param textResponse
	 */
	this.emailCheckHandler = function(html,textResponse){
		var response = false;
		try {
			response = $.parseJSON(html);
		}catch(e){
			that.checking--;
			return;
		}
		var risposta = form.find('input[name=email]').parent().find('.risposta');
		
		if(response == true){
			if(risposta.hasClass('ok')){
				risposta.removeClass('ok');
			}
			
			risposta.addClass('errore');
			risposta.html('Email gia\' esistente!');
			
			ErrorCheck.email = true;
			
		}else{
			if(risposta.hasClass('errore')){
				risposta.removeClass('errore');
			}
			
			risposta.addClass('ok');
			risposta.html('Email ok!');
			
			ErrorCheck.email = false;
		}
		
		that.checking--;
		
	}
	/**
	 * Aggiunge controlli aggiuntivi ai campi
	 */
	this.addChecks = function() {
		
		//Username check
		var username = form.find('input[name=username]');
		
		username.change(function(){
			
			if(ErrorVal.username == false){
				that.usernameCheck(username.val());
			}
		});
		
		//Password check
		var password = form.find('input[name=password]');
		var conf_pass = form.find('input[name=conferma_password]');
		
		password.change(function(){
			if(ErrorVal.password == false && ErrorVal.conferma_password == false){
				checkPasswords();
			}
			
		})
		
		conf_pass.change(function(){
			if(ErrorVal.password == false && ErrorVal.conferma_password == false){
				checkPasswords();
			}
		})
		
		//Email check
		var email = form.find('input[name=email]');
		var conf_email = form.find('input[name=conferma_email]');
		
		email.change(function(){
			
			if(ErrorVal.email == false && ErrorVal.conferma_email == false){
				checkEmails();
			}
			
		});
		
		conf_email.change(function(){
			if(ErrorVal.email == false && ErrorVal.conferma_email == false){
				checkEmails();
			}
		});
		
	}
	/**
	 * Controlla che le password siano uguali
	 */
	var checkPasswords = function() {
		var password = form.find('input[name=password]');
		var conf_pass = form.find('input[name=conferma_password]');
		
		var risposta = conf_pass.parent().find('.risposta');
		
		if(password.val() == conf_pass.val()){
			if(risposta.hasClass('errore')){
				risposta.removeClass('errore');
			}
			
			risposta.addClass('ok');
			risposta.html('Le password coincidono!');
			
			ErrorCheck.conferma_password = false;
		}else{
			if(risposta.hasClass('ok')){
				risposta.removeClass('ok');
			}
			
			risposta.addClass('errore');
			risposta.html('Le password non coincidono ricontrolla!');
			
			ErrorCheck.conferma_password = true;
		}
		
		
	}
	/**
	 * Controlla che le email siano uguali
	 */
	var checkEmails = function() {
		var email = form.find('input[name=email]');
		var conf_email = form.find('input[name=conferma_email]');
		
		var risposta = conf_email.parent().find('.risposta');
		
		if(email.val() == conf_email.val()){
			if(risposta.hasClass('errore')){
				risposta.removeClass('errore');
			}
			
			risposta.addClass('ok');
			risposta.html('Le email coincidono!');
			
			ErrorCheck.conferma_email = false;
			
			that.emailCheck(email.val());
			
		}else{
			if(risposta.hasClass('ok')){
				risposta.removeClass('ok');
			}
			
			risposta.addClass('errore');
			risposta.html('Le email non coincidono ricontrolla!');
			
			ErrorCheck.conferma_email = true;
		}
	}
	/**
	 * Effettua controlli al submit, se tutto va bene, redirect
	 */
	this.addSubmit = function(){
		
		form.submit(function(e){
			
			//Controllo se ci sono chiamate ajax in attesa
			if(that.checking != 0){
				window.messaggioPopup.display('Attendi','Per favore attendi un momento, stiamo verificando la\
						correttezza dei dati');
				return false;
			}
			
			for(var i in ErrorVal){
				form.find('input[name='+i+']').trigger('change');
			}
			
			
			for(var i in ErrorVal){
				
				if(ErrorVal[i] == true){
					window.messaggioPopup.display('Errore login!','I dati da lei inseriti non sono corretti!');
					return false;
				}
			}
			
			for(var i in ErrorCheck){
				if(ErrorCheck[i] == true){
					window.messaggioPopup.display('Errore login!','Alcuni campi non sono validi!');
					return false;
				}
			}
			
			if(window.console && window.debug){
				window.console.info('Analizzando il form ...');
			}
			
			var dati = {};
			var url = 'index.php';
			
			form.find('*[name]').each(function(){
				
				var name = $(this).attr('name');
				var value = $(this).val();
				dati[name] = value;
				
			});
			
			window.ajax.doAjax(url,dati);
			
			return false;
			
		});
	}
	/**
	 * Aggiunge
	 */
	this.loader = function() {
		addValidation();
		that.addChecks();
		that.addSubmit();
	}
	
	this.loader();
}
